package com.itheima.d1_serialize;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

//目标：序列化和反序列化的补充
public class Demo04 {
    public static void main(String[] args) throws Exception {
        //注意：反序列化对象的顺序要和序列化对象的顺序保持一致！

        //1.创建对象
        Teacher tea = new Teacher("张三", 23);
        Person per = new Person("李四", 24, null);

        //2.将两个对象依次序列化
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("day10-io&thread\\resources\\obj.txt"));
        oos.writeObject(tea);
        oos.writeObject(per);

        //刷新和释放资源
        oos.flush();
        oos.close();

        //3.读取obj.txt文件中存储的对象
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("day10-io&thread\\resources\\obj.txt"));

        //先序列化的是Teacher对象，所以先读的也是Teacher对象
        Teacher teacher = (Teacher) ois.readObject();
        Person person = (Person) ois.readObject();

        System.out.println(teacher);
        System.out.println(person);

        /*
            4.序列化后，在反序列化之前修改Teacher类的属性，增加一个String gender属性
            效果：修改了类的属性/实例方法之后，再反序列化，代码运行会报错！

            原理：序列化时底层会给Teacher类一个serialVersionUID（标记），反序列化时会对比serialVersionUID的值是否一样。
            但是反序列化时Teacher类被修改了，所以默认分配serialVersionUID也会修改！
            这就导致序列化和反序列化时serialVersionUID不一样，代码运行就会报错！

            解决方案：给Teacher类一个固定的serialVersionUID，让它不会因为类的改变而修改！
         */
    }
}
